#include <QCoreApplication>   // 实现加减乘符号的重载（复数举例）
#include <iostream>

class Complex //只有现有类，后面才能声明对象
{
private:
    int real, imag;
public:

    Complex (int r = 0, int i = 0){        //类后面要构造（定义）自己
        real = r;                          //构造函数的特征，就是构造函数的名称要与类的名称一样。
        imag = i;
    }

    Complex& operator+(Complex const &obj){ //通过声明函数operator+，目的是重载运算符+

        Complex res;                        //定义一个临时复数res
        res.real = this ->real + obj.real;  //如果res用this代替的话，会出现this值每次更新的情况，即c1值会改变！
        res.imag = this ->imag + obj.imag;
        return res;
    }
    Complex& operator-(Complex const &obj){

        Complex res;
        res.real = this ->real - obj.real;
        res.imag = this ->imag - obj.imag;
        return res;
    }
    Complex& operator*(Complex const &obj){

        Complex res;
        res.real = this ->real * obj.real - this ->imag * obj.imag;
        res.imag = this ->imag * obj.real + this ->real * obj.imag;
        return res;

    }

    void print() {std::cout << real << "+" << imag << "i" << std::endl;} //这里重载了标准库里的函数print，这是函数重载，类似于运算符重载一样。
};


int main(int argc, char *argv[]) //如果我们不调用头文件，只在一个main函数里实现，那么main函数最好写在最后面。
{
    Complex c1(1,2);  //这里进行实例化对象（main函数才有实例化对象的说法），如果main函数写在前面，那么就会显示没有定义。
    Complex c2(3,4);  //这里实例化就类似于，int 5一样，Complex就是int,c2就是5。
    Complex c3 = c1 + c2;
    Complex c4 = c1 - c2;
    Complex c5 = c1 * c2;

    c3.print();
    c4.print();
    c5.print();
}

